/**
 * 格式化工具函数
 */
import dayjs from 'dayjs'

/**
 * 格式化日期
 * @param date 日期
 * @param format 格式（默认：YYYY-MM-DD）
 */
export function formatDate(date: string | Date, format: string = 'YYYY-MM-DD'): string {
  if (!date) return ''
  return dayjs(date).format(format)
}

/**
 * 格式化时间
 * @param date 日期
 * @param format 格式（默认：HH:mm:ss）
 */
export function formatTime(date: string | Date, format: string = 'HH:mm:ss'): string {
  if (!date) return ''
  return dayjs(date).format(format)
}

/**
 * 格式化日期时间
 * @param date 日期
 * @param format 格式（默认：YYYY-MM-DD HH:mm:ss）
 */
export function formatDateTime(date: string | Date, format: string = 'YYYY-MM-DD HH:mm:ss'): string {
  if (!date) return ''
  return dayjs(date).format(format)
}

/**
 * 格式化金额（保留2位小数，添加千分位）
 * @param amount 金额
 * @param decimals 小数位数（默认：2）
 * @param unit 单位（默认：元）
 */
export function formatMoney(amount: number | string, decimals: number = 2, unit: string = '元'): string {
  if (amount === null || amount === undefined || amount === '') return '-'

  const num = Number(amount)
  if (isNaN(num)) return '-'

  // 保留指定小数位
  const fixed = num.toFixed(decimals)

  // 添加千分位
  const parts = fixed.split('.')
  if (parts[0]) {
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',')
  }

  return parts.join('.') + unit
}

/**
 * 格式化百分比
 * @param value 数值（0-1）
 * @param decimals 小数位数（默认：2）
 */
export function formatPercent(value: number | string, decimals: number = 2): string {
  if (value === null || value === undefined || value === '') return '-'

  const num = Number(value)
  if (isNaN(num)) return '-'

  return (num * 100).toFixed(decimals) + '%'
}

/**
 * 格式化文件大小
 * @param size 文件大小（字节）
 */
export function formatFileSize(size: number): string {
  if (!size) return '0 B'

  const units = ['B', 'KB', 'MB', 'GB', 'TB']
  let index = 0

  while (size >= 1024 && index < units.length - 1) {
    size /= 1024
    index++
  }

  return size.toFixed(2) + ' ' + units[index]
}

/**
 * 格式化手机号（隐藏中间4位）
 */
export function formatPhone(phone: string): string {
  if (!phone) return ''
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}

/**
 * 格式化身份证号（隐藏中间10位）
 */
export function formatIdCard(idCard: string): string {
  if (!idCard) return ''
  return idCard.replace(/(\d{4})\d{10}(\d{4})/, '$1**********$2')
}

/**
 * 截取字符串（超出部分用...代替）
 * @param str 字符串
 * @param length 长度
 */
export function formatEllipsis(str: string, length: number): string {
  if (!str) return ''
  if (str.length <= length) return str
  return str.substring(0, length) + '...'
}

/**
 * 数字补零
 * @param num 数字
 * @param length 长度（默认：2）
 */
export function padZero(num: number, length: number = 2): string {
  return String(num).padStart(length, '0')
}
